package com.lqq.designPattern.bulider_pattern.singleton.demo8;

import java.io.Serializable;

/**
 * 静态内部类方式 懒汉式
 * 反射破坏单例模式（除了枚举不能破坏）
 * */
public class Singleton implements Serializable {
//    //构造器私有
//    private Singleton() {}
//    //静态内部类
//    private static class SingletonHolder{
//        //在内部类中声明并初始化外部类的对象
//        private static final Singleton INSTANCE = new Singleton();
//    }
//    //提供一个公共的访问方式，让外界获取该对象
//    public static Singleton getInstance() {
//        return SingletonHolder.INSTANCE;
//    }

    /**
     * 反射破坏单例的解决方法，就拿静态内部类举例，加个红绿灯
     */
    private static boolean flag = false;
    //构造器私有
    private Singleton() {
        if (flag) {//表明不是第一次调用无参构造，抛异常
            throw new RuntimeException("不能创建多个对象！");
        }
        //else，更改flag的值为true
        flag = true;
    }
    //静态内部类
    private static class SingletonHolder{
        //在内部类中声明并初始化外部类的对象
        private static final Singleton INSTANCE = new Singleton();
    }
    //提供一个公共的访问方式，让外界获取该对象
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

}
